home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / SNNSV32.ZIP / SNNSv3.2 / xgui / sources / bn_basics.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-04-25  |  18.4 KB  |  611 lines

  1. /*****************************************************************************
  2.   FILE           : bn_basics.c
  3.   SHORTNAME      : bn_basics
  4.   SNNS VERSION   : 3.2
  5.  
  6.   PURPOSE        : Provides general procedures for the BigNet Tool
  7.   NOTES          :
  8.  
  9.   AUTHOR         : Kai-Uwe Herrmann
  10.   DATE           : 15.1.1993
  11.  
  12.   CHANGED BY     : Ralf Huebner
  13.   IDENTIFICATION : @(#)bn_basics.c    1.18 3/2/94
  14.   SCCS VERSION   : 1.18
  15.   LAST CHANGE    : 3/2/94
  16.  
  17.              Copyright (c) 1990-1994  SNNS Group, IPVR, Univ. Stuttgart, FRG
  18.  
  19. ******************************************************************************/
  20.  
  21.  
  22.  
  23. #include <stdlib.h>
  24. #include <stdio.h>
  25. #include <X11/Xlib.h>
  26. #include <X11/Xutil.h>
  27. #include <X11/Xos.h>
  28. #include <X11/cursorfont.h>
  29. #include <X11/Intrinsic.h>
  30. #include <X11/StringDefs.h>
  31. #include <X11/Shell.h>
  32. #include <X11/Xaw/Box.h>
  33. #include <X11/Xaw/Simple.h>
  34. #include <X11/Xaw/Grip.h>
  35. #include <X11/Xaw/Form.h>
  36. #include <X11/Xaw/SmeBSB.h>
  37. #include <X11/Xaw/SmeLine.h>
  38. #include <X11/Xaw/Viewport.h>
  39. #include <X11/Xaw/Label.h>
  40. #include <X11/Xaw/Toggle.h>
  41. #include <X11/Xaw/Command.h>
  42. #include <X11/Xaw/Cardinals.h>
  43. #include <X11/Xaw/AsciiText.h>
  44. #include <X11/Xaw/Scrollbar.h>
  45.  
  46. #include "ui.h"
  47. #include "glob_typ.h"
  48. #include "kr_ui.h"
  49. #include "ui_mainP.h"
  50. #include "ui_confirmer.h"
  51. #include "ui_textP.h"
  52. #include "ui_utilP.h"
  53. #include "ui_netUpdate.h"
  54. #include "ui_status.h"
  55. #include "ui_xWidgets.h"
  56. #include "ui_fileP.h"
  57. #include "ui_display.h"
  58. #include "ui_event.h"
  59. #include "ui_selection.h"
  60.  
  61. #include "bn_basics.ph"
  62.  
  63. #include "enter.xbm"
  64. #include "delete.xbm"
  65. #include "insert.xbm"
  66. #include "plane_to_edit.xbm"
  67. #include "type.xbm"
  68. #include "pos.xbm"
  69. #include "overwrite.xbm"
  70. #include "link_to_edit.xbm"
  71. #include "create_net.xbm"
  72. #include "full_connection.xbm"
  73. #include "shortcut_connection.xbm"
  74. #include "cancel.xbm"
  75. #include "next.xbm"
  76. #include "prev.xbm"
  77. #include "first.xbm"
  78. #include "last.xbm"
  79. #include "done.xbm"
  80. #include "feed_forward.xbm"
  81. #include "time_delay.xbm"
  82. #include "create_td_net.xbm"
  83. #include "art1.xbm"
  84. #include "art2.xbm"
  85. #include "artmap.xbm"
  86. #include "kohonen.xbm"
  87. #include "cancel2.xbm"
  88. #include "jordan.xbm"
  89. #include "elman.xbm"
  90. #include "hopfield.xbm"
  91. #include "assoz.xbm"
  92.  
  93.  
  94.  
  95.  
  96.  
  97.  
  98.  
  99. /*****************************************************************************
  100.   FUNCTION : bn_basics_xCreateButtonItem
  101.  
  102.   PURPOSE  : create a command widget
  103.   NOTES    :
  104.   RETURNS  : the widget number of the widget
  105.   UPDATE   : 19.1.1993
  106. ******************************************************************************/
  107.  
  108. Widget bn_basics_xCreateButtonItem (char *name,Widget parent,Widget left,Widget top)
  109.  
  110. {
  111.     uint n;
  112.     Widget   w;
  113.     Arg         arg[15];
  114.     
  115.     n = 0;
  116.     if (strcmp (name, "enter") == 0)
  117.       {  
  118.         XtSetArg(arg[n], XtNbitmap, 
  119.                   (Pixmap) XCreateBitmapFromData (ui_display,
  120.                    XDefaultRootWindow (ui_display), 
  121.                    enter_bits, enter_width, enter_height)); n++;
  122.       } 
  123.     if (strcmp (name, "prev") == 0)
  124.       {  
  125.         XtSetArg(arg[n], XtNbitmap, 
  126.                   (Pixmap) XCreateBitmapFromData (ui_display,
  127.                    XDefaultRootWindow (ui_display), 
  128.                    prev_bits, prev_width, prev_height)); n++;
  129.       } 
  130.     if (strcmp (name, "next") == 0)
  131.       {  
  132.         XtSetArg(arg[n], XtNbitmap, 
  133.                   (Pixmap) XCreateBitmapFromData (ui_display,
  134.                    XDefaultRootWindow (ui_display), 
  135.                    next_bits, next_width, next_height)); n++;
  136.       } 
  137.     if (strcmp (name, "first") == 0)
  138.       {  
  139.         XtSetArg(arg[n], XtNbitmap, 
  140.                   (Pixmap) XCreateBitmapFromData (ui_display,
  141.                    XDefaultRootWindow (ui_display), 
  142.                    first_bits,first_width,first_height)); n++;
  143.       } 
  144.     if (strcmp (name, "last") == 0)
  145.       {  
  146.         XtSetArg(arg[n], XtNbitmap, 
  147.                   (Pixmap) XCreateBitmapFromData (ui_display,
  148.                    XDefaultRootWindow (ui_display), 
  149.                    last_bits,last_width,last_height)); n++;
  150.       } 
  151.     if (strcmp (name, "delete") == 0)
  152.       {  
  153.         XtSetArg(arg[n], XtNbitmap, 
  154.                   (Pixmap) XCreateBitmapFromData (ui_display,
  155.                    XDefaultRootWindow (ui_display), 
  156.                    delete_bits,delete_width,delete_height)); n++;
  157.       } 
  158.     if (strcmp (name, "insert") == 0)
  159.       {  
  160.         XtSetArg(arg[n], XtNbitmap, 
  161.                   (Pixmap) XCreateBitmapFromData (ui_display,
  162.                    XDefaultRootWindow (ui_display), 
  163.                    insert_bits,insert_width,insert_height)); n++;
  164.       } 
  165.     if (strcmp (name, "overwrite") == 0)
  166.       {  
  167.         XtSetArg(arg[n], XtNbitmap, 
  168.                   (Pixmap) XCreateBitmapFromData (ui_display,
  169.                    XDefaultRootWindow (ui_display), 
  170.                    overwrite_bits,overwrite_width,overwrite_height)); n++;
  171.       } 
  172.     if (strcmp (name, "plane_to_edit") == 0)
  173.       {  
  174.         XtSetArg(arg[n], XtNbitmap, 
  175.                   (Pixmap) XCreateBitmapFromData (ui_display,
  176.                    XDefaultRootWindow (ui_display), 
  177.                    plane_to_edit_bits,plane_to_edit_width,plane_to_edit_height)); n++;
  178.       } 
  179.     if (strcmp (name, "type") == 0)
  180.       {  
  181.         XtSetArg(arg[n], XtNbitmap, 
  182.                   (Pixmap) XCreateBitmapFromData (ui_display,
  183.                    XDefaultRootWindow (ui_display), 
  184.                    type_bits,type_width,type_height)); n++;
  185.       } 
  186.     if (strcmp (name, "pos") == 0)
  187.       {  
  188.         XtSetArg(arg[n], XtNbitmap, 
  189.                   (Pixmap) XCreateBitmapFromData (ui_display,
  190.                    XDefaultRootWindow (ui_display), 
  191.                    pos_bits,pos_width,pos_height)); n++;
  192.       } 
  193.     if (strcmp (name, "link_to_edit") == 0)
  194.       {  
  195.         XtSetArg(arg[n], XtNbitmap, 
  196.                   (Pixmap) XCreateBitmapFromData (ui_display,
  197.                    XDefaultRootWindow (ui_display), 
  198.                    link_to_edit_bits,link_to_edit_width,link_to_edit_height)); n++;
  199.       } 
  200.     if (strcmp (name, "full_connection") == 0)
  201.       {  
  202.         XtSetArg(arg[n], XtNbitmap, 
  203.                   (Pixmap) XCreateBitmapFromData (ui_display,
  204.                    XDefaultRootWindow (ui_display), 
  205.                    full_connection_bits,full_connection_width,full_connection_height)); n++;
  206.       } 
  207.     if (strcmp (name, "shortcut_connection") == 0)
  208.       {  
  209.         XtSetArg(arg[n], XtNbitmap, 
  210.                   (Pixmap) XCreateBitmapFromData (ui_display,
  211.                    XDefaultRootWindow (ui_display), 
  212.                    shortcut_connection_bits,shortcut_connection_width,
  213.            shortcut_connection_height)); n++;
  214.       } 
  215.     if (strcmp (name, "create_td_net") == 0)
  216.       {  
  217.         XtSetArg(arg[n], XtNbitmap, 
  218.                   (Pixmap) XCreateBitmapFromData (ui_display,
  219.                    XDefaultRootWindow (ui_display),create_td_net_bits,
  220.            create_td_net_width,create_td_net_height)); 
  221.         n++;
  222.       } 
  223.     if (strcmp (name, "done") == 0)
  224.       {  
  225.         XtSetArg(arg[n], XtNbitmap, 
  226.                   (Pixmap) XCreateBitmapFromData (ui_display,
  227.                    XDefaultRootWindow (ui_display), 
  228.                    done_bits,done_width,done_height)); n++;
  229.       } 
  230.     if (strcmp (name, "cancel") == 0)
  231.       {  
  232.         XtSetArg(arg[n], XtNbitmap, 
  233.                   (Pixmap) XCreateBitmapFromData (ui_display,
  234.                    XDefaultRootWindow (ui_display), 
  235.                    cancel_bits,cancel_width,cancel_height)); n++;
  236.       } 
  237.     if (strcmp (name, "create_net") == 0)
  238.       {  
  239.         XtSetArg(arg[n], XtNbitmap, 
  240.                   (Pixmap) XCreateBitmapFromData (ui_display,
  241.                    XDefaultRootWindow (ui_display), 
  242.                    create_net_bits,create_net_width,create_net_height)); n++;
  243.       } 
  244.     if (strcmp (name, "feed_forward") == 0)
  245.       {  
  246.         XtSetArg(arg[n], XtNbitmap, 
  247.                   (Pixmap) XCreateBitmapFromData (ui_display,
  248.                    XDefaultRootWindow (ui_display), 
  249.                    feed_forward_bits,feed_forward_width, feed_forward_height)); 
  250.         n++;
  251.       } 
  252.     if (strcmp (name, "time_delay") == 0)
  253.       {  
  254.         XtSetArg(arg[n], XtNbitmap, 
  255.                   (Pixmap) XCreateBitmapFromData (ui_display,
  256.                    XDefaultRootWindow (ui_display), 
  257.                    time_delay_bits,time_delay_width,time_delay_height)); 
  258.         n++;
  259.       } 
  260.     if (strcmp (name, "art1") == 0)
  261.       {  
  262.         XtSetArg(arg[n], XtNbitmap, 
  263.                   (Pixmap) XCreateBitmapFromData (ui_display,
  264.                    XDefaultRootWindow (ui_display), 
  265.                    art1_bits, art1_width, art1_height)); n++;
  266.       } 
  267.     if (strcmp (name, "art2") == 0)
  268.       {  
  269.         XtSetArg(arg[n], XtNbitmap, 
  270.                   (Pixmap) XCreateBitmapFromData (ui_display,
  271.                    XDefaultRootWindow (ui_display), 
  272.                    art2_bits, art2_width, art2_height)); n++;
  273.       } 
  274.     if (strcmp (name, "artmap") == 0)
  275.       {  
  276.         XtSetArg(arg[n], XtNbitmap, 
  277.                   (Pixmap) XCreateBitmapFromData (ui_display,
  278.                    XDefaultRootWindow (ui_display), 
  279.                    artmap_bits,artmap_width,artmap_height)); n++;
  280.       } 
  281.  
  282.     if (strcmp (name, "kohonen") == 0)
  283.       {  
  284.         XtSetArg(arg[n], XtNbitmap, 
  285.                   (Pixmap) XCreateBitmapFromData (ui_display,
  286.                    XDefaultRootWindow (ui_display), 
  287.                    kohonen_bits,kohonen_width,kohonen_height)); n++;
  288.       } 
  289.     if (strcmp (name, "hopfield") == 0)
  290.       {  
  291.         XtSetArg(arg[n], XtNbitmap, 
  292.                   (Pixmap) XCreateBitmapFromData (ui_display,
  293.                    XDefaultRootWindow (ui_display), 
  294.                    hopfield_bits,hopfield_width,hopfield_height)); n++;
  295.       } 
  296.  
  297.     if (strcmp (name, "assoz") == 0)
  298.       {  
  299.         XtSetArg(arg[n], XtNbitmap, 
  300.                   (Pixmap) XCreateBitmapFromData (ui_display,
  301.                    XDefaultRootWindow (ui_display), 
  302.                    assoz_bits,assoz_width,assoz_height)); n++;
  303.       } 
  304.  
  305.     if (strcmp (name, "cancel2") == 0)
  306.       {  
  307.         XtSetArg(arg[n], XtNbitmap, 
  308.                   (Pixmap) XCreateBitmapFromData (ui_display,
  309.                    XDefaultRootWindow (ui_display), 
  310.                    cancel2_bits,cancel2_width,cancel2_height)); n++;
  311.       } 
  312.  
  313.     if (strcmp (name, "jordan") == 0)
  314.       {  
  315.         XtSetArg(arg[n], XtNbitmap, 
  316.                   (Pixmap) XCreateBitmapFromData (ui_display,
  317.                    XDefaultRootWindow (ui_display), 
  318.                    jordan_bits,jordan_width,jordan_height)) ; n++ ;
  319.       } 
  320.  
  321.     if (strcmp (name, "elman") == 0)
  322.       {  
  323.         XtSetArg(arg[n], XtNbitmap, 
  324.                   (Pixmap) XCreateBitmapFromData (ui_display,
  325.                    XDefaultRootWindow (ui_display), 
  326.                    elman_bits,elman_width,elman_height)) ; n++ ;
  327.       } 
  328.  
  329.     XtSetArg(arg[n], XtNborderWidth, 0); n++;
  330.     XtSetArg(arg[n], XtNinternalHeight, 1); n++;
  331.     XtSetArg(arg[n], XtNinternalWidth , 1); n++;
  332.  
  333.     XtSetArg(arg[n], XtNfromVert , top);  n++;
  334.     XtSetArg(arg[n], XtNfromHoriz, left);  n++;
  335.     XtSetArg(arg[n], XtNleft  , XtChainLeft); n++;
  336.     XtSetArg(arg[n], XtNright , XtChainLeft); n++;
  337.     XtSetArg(arg[n], XtNtop   , XtChainTop); n++;
  338.     XtSetArg(arg[n], XtNbottom, XtChainTop); n++;
  339.     w = XtCreateManagedWidget(name, commandWidgetClass, parent, arg, n);
  340.     return(w);
  341.  
  342. }
  343.  
  344.  
  345.  
  346. /*****************************************************************************
  347.   FUNCTION : bn_basics_createART
  348.  
  349.   PURPOSE  : create ART1 panel
  350.   NOTES    : calling function has to allocate memory for unitWidget and
  351.              rowWidget arrays.
  352.  
  353.   UPDATE   : 20.1.1993
  354. ******************************************************************************/
  355.  
  356. void bn_basics_createART(int model, Widget *baseWidget,int *already_open,
  357.                          Widget unitWidget[], Widget rowWidget[],
  358.                          XtCallbackProc   CreateCallbackProc,
  359.                          XtCallbackProc   DoneCallbackProc
  360.                         )
  361.  
  362. {
  363.     Widget      artpanel, artform, button, dummy1x, dummy1y;
  364.     Widget      dummy2x, dummy3, dummy4, dummy5;
  365.     Arg        args[10];
  366.     Cardinal    n = 0;
  367.     char        buf[40];
  368.     int         colwidth = 12;
  369.     int         Width, Height;
  370.     int         NoOfDialogRows;
  371.     int         i;
  372.     char        Name[4][20];
  373.     char        ModelName[20];
  374.     
  375.     switch (model) {
  376.     case ART1_MODEL:
  377.        sprintf(ModelName,"ART 1");
  378.        Width = 314;
  379.        Height = 103;
  380.        NoOfDialogRows = 2;
  381.        strcpy(Name[0],"F1 layer: ");
  382.        strcpy(Name[1],"F2 layer: ");
  383.        break;
  384.     case ART2_MODEL:
  385.        sprintf(ModelName,"ART 2");
  386.        Width = 314;
  387.        Height = 124;
  388.        NoOfDialogRows = 2;
  389.        strcpy(Name[0],"F1 layer: ");
  390.        strcpy(Name[1],"F2 layer: ");
  391.        break;
  392.     case ARTMAP_MODEL:
  393.        sprintf(ModelName,"ARTMAP");
  394.        Width = 314;
  395.        Height = 149;
  396.        NoOfDialogRows = 4;
  397.        strcpy(Name[0],"F1a layer: ");
  398.        strcpy(Name[1],"F2a layer: ");
  399.        strcpy(Name[2],"F1b layer: ");
  400.        strcpy(Name[3],"F2b layer: ");
  401.        break;
  402.     default:
  403.        *baseWidget = NULL;
  404.        *already_open = 0;
  405.        return;
  406.     } /*switch*/
  407.  
  408.     if ( ! *already_open) {
  409.  
  410.        sprintf(buf,"BigNet (%s)", ModelName);
  411.        
  412. /*
  413.        XtSetArg(args[n],XtNminHeight,Height); n++;
  414.        XtSetArg(args[n],XtNminWidth,Width); n++;  
  415.        XtSetArg(args[n],XtNmaxHeight,Height); n++;
  416.        XtSetArg(args[n],XtNmaxWidth,Width); n++;
  417. */       
  418.  
  419.        *baseWidget = 
  420.         XtCreatePopupShell(buf, topLevelShellWidgetClass, ui_toplevel,
  421.                            args, n);
  422.  
  423.        artform = XtCreateManagedWidget ("box", boxWidgetClass, *baseWidget, args,n);
  424.  
  425.        artpanel = XtCreateManagedWidget ("form", formWidgetClass, artform,
  426.                       NULL, 0);
  427.  
  428.        
  429.        /* Headings */
  430.        dummy1y = dummy1x =
  431.              ui_xCreateLabelItem (" ",artpanel, colwidth*8, NULL, NULL);
  432.        dummy2x = 
  433.              ui_xCreateLabelItem ("No. of units", artpanel, colwidth*8, dummy1x, NULL);
  434.        dummy3 = 
  435.              ui_xCreateLabelItem ("No. of rows", artpanel, colwidth*8, dummy2x, NULL);
  436.  
  437.        /* dialog rows */
  438.        for (i=0; i<NoOfDialogRows; i++) {
  439.  
  440.           dummy3 = 
  441.             ui_xCreateLabelItem (Name[i], artpanel, colwidth*8, NULL, dummy1y);
  442.           dummy4 = 
  443.             ui_xCreateLabelItem (" ", artpanel, 2*8, dummy1x,dummy1y);
  444.           unitWidget[i] = 
  445.             ui_xCreateDialogItem (" ", artpanel, "",  6*8, dummy4, dummy1y);
  446.           dummy5 = 
  447.             ui_xCreateLabelItem (" ", artpanel, 2*8, dummy2x, dummy1y);
  448.           rowWidget[i]  = dummy1y = 
  449.             ui_xCreateDialogItem (" ", artpanel, "",  6*8, dummy5, dummy1y);
  450.          
  451.        } /*for*/
  452.        
  453.        /* blank line */
  454. /*       dummy3 = ui_xCreateLabelItem (" ", artpanel, colwidth*8, NULL, dummy1y); */
  455.  
  456.        dummy3 = dummy5;
  457.  
  458.        /* buttons have to be defined by calling procedure */
  459.        button = bn_basics_xCreateButtonItem ("create_net", artform, NULL, dummy3);
  460.          XtAddCallback (button, XtNcallback, CreateCallbackProc, NULL); 
  461.        button = bn_basics_xCreateButtonItem ("done", artform, button, dummy3);
  462.          XtAddCallback (button, XtNcallback,DoneCallbackProc, NULL); 
  463.  
  464.        ui_checkWindowPosition(*baseWidget);
  465.        XtPopup (*baseWidget, XtGrabNone); 
  466.        ui_xDontResizeWidget (*baseWidget);
  467.  
  468.        *already_open = 1;
  469.  
  470.    } else {
  471.        
  472.        sprintf (buf,"BigNet (%s) already loaded!", ModelName);
  473.        ui_confirmOk (buf);
  474.  
  475.    } /*if*/
  476.  
  477. }
  478.  
  479.  
  480.  
  481.  
  482. /*****************************************************************************
  483.   FUNCTION : bn_basics_refresh();
  484.  
  485.   PURPOSE  : refresh Dispaly
  486.   NOTES    :
  487.  
  488.   UPDATE   : 20.1.1993
  489. ******************************************************************************/
  490.  
  491. void bn_basics_refresh (void)
  492.  
  493. {
  494.  
  495.    ui_sel_resetList();
  496.    ui_net_completeRefresh(ui_currentDisplay,2);
  497.    ui_stat_displayStatus(ui_gridPosMouse);
  498.    strcpy(ui_filenameNET,"SNNS_NET");
  499.    strcpy(ui_filenameSLNET,"SNNS_NET");
  500.    ui_file_updateShellLabels();
  501.  
  502. }
  503.  
  504.  
  505.  
  506. /*****************************************************************************
  507.   FUNCTION : bn_basics_check_existingNetwork();
  508.  
  509.   PURPOSE  : check if network exists and if so, as user if he wants to erase
  510.              it by creating the new one
  511.   NOTES    : returns TRUE, if no current network exists or user pressed YES.
  512.              returns FALSE, if current network exists and user pressed NO.
  513.  
  514.   UPDATE   : 20.1.1993
  515. ******************************************************************************/
  516.  
  517. int bn_basics_check_existingNetwork (void)
  518.  
  519. {
  520.  
  521.   if (krui_getNoOfUnits()) { /* There is an existing network */
  522.  
  523.      if ( ! ui_confirmYes ("Create will erase current network. Create?")) {
  524.         return 0;
  525.      } else {
  526.         krui_deleteNet();
  527.         return 1;
  528.      } /*if*/
  529.  
  530.   } else { /* There is no existing network */
  531.  
  532.       return 1;
  533.  
  534.   } /*if*/
  535.  
  536.  
  537.  
  538.  
  539.  
  540.  
  541. /*****************************************************************************
  542.   FUNCTION : bn_basics_getValues();
  543.  
  544.   PURPOSE  : read out user values from dialog widgets
  545.   NOTES    : calling function has to allocate memory for unit and row array
  546.  
  547.   UPDATE   : 20.1.1993
  548. ******************************************************************************/
  549.  
  550. void bn_basics_getValues (int NoOfLayers, int units[], int rows[],
  551.                           Widget unitWidget[], Widget rowWidget[])
  552.  
  553. {
  554.    int i;
  555.  
  556.    for (i=0; i<NoOfLayers; i++) {
  557.       units[i] = ui_xIntFromAsciiWidget(unitWidget[i]);
  558.       rows[i]  = ui_xIntFromAsciiWidget(rowWidget[i]);
  559.    } /*for*/
  560.  
  561.    return;
  562.  
  563. }
  564.  
  565.  
  566. /*****************************************************************************
  567.   FUNCTION : bn_basics_checkValues();
  568.  
  569.   PURPOSE  : check the values, the user entered
  570.   NOTES    : returns TRUE, if values OK
  571.              returns FALSE, if illegal values have been entered.
  572.              calling function has to allocate memory for unit and row array
  573.  
  574.   UPDATE   : 20.1.1993
  575. ******************************************************************************/
  576.  
  577. int bn_basics_checkValues (int NoOfLayers, int units[], int rows[])
  578.  
  579. {
  580.    int  i;
  581.    char buf[80];
  582.  
  583.    for (i=0; i<NoOfLayers; i++) {
  584.  
  585.      if (units[i] < 1) {
  586.         sprintf (buf,"Number of units has to be greater than 0 in line %d!",i+1);
  587.         ui_confirmOk (buf);
  588.         return 0;
  589.      } /*if*/
  590.  
  591.      if (rows[i] < 1) {
  592.         sprintf (buf,"Number of rows has to be greater than 0 in line %d!",i+1);
  593.         ui_confirmOk (buf);
  594.         return 0;
  595.      } /*if*/
  596.  
  597.      if (units[i] < rows[i]) {
  598.         sprintf(buf,
  599.                 "Number of rows must not be greater\nthan number of units in line %d!",
  600.                 i+1);
  601.         ui_confirmOk (buf);
  602.         return 0;
  603.      } /*if*/
  604.  
  605.    } /*for*/
  606.  
  607.    return 1;
  608.  
  609.